使用Resource Group(资源组)进行负载管理
云原生数据仓库 AnalyticDB PostgreSQL 版提供的资源组管理功能,支持绑定数据库账号到资源组,并为资源组内的查询设置最大并发事务数、CPU使用率和内存占比等,可以使资源变得弹性,获得更高的查询速度。
版本限制
内核版本为v6.6.1.0及以上的AnalyticDB PostgreSQL 6.0版实例,以及内核版本为v7.0.6.3及以上的AnalyticDB PostgreSQL 7.0版实例,可以通过控制台直接将资源管理方式切换为资源组管理。
内核版本为v6.6.1.0以下的AnalyticDB PostgreSQL 6.0版实例,以及内核版本为v7.0.6.3以下的AnalyticDB PostgreSQL 7.0版实例需要提交工单来将资源管理方式切换为资源组管理。
如何查看实例内核版本,请参见查看内核小版本。
资源组(Resource Group)简介
云原生数据仓库 AnalyticDB PostgreSQL 版支持使用资源组(Resource Group)对数据库进行资源管理,相对于使用资源队列(Resource Queue)管理资源的方式具有更精细化、管理资源类别更全面的优势。资源组管理与资源队列管理不能同时使用,仅能使用一个,开启资源组管理之后资源队列自动失效。关于资源队列的更多介绍,请参见使用Resource Queue(资源队列)进行负载管理。
在使用资源组进行资源管理时,可以为资源组绑定一个或多个数据库账号,并针对每个资源组单独设置其特定的CPU、内存和并发限制等,来管理各个资源组绑定账号提交的查询,但SET、RESET和SHOW命令不受资源组配置限制。
6.0资源组
AnalyticDB PostgreSQL 6.0版资源组支持配置的资源类别如下:
参数 | 描述 | 取值 |
CONCURRENCY | 资源组内允许的最大并发事务数(并行运行的查询数)。 | 默认值:50,非必填, 取值范围:1~max_connections。该参数具体内容,请参见性能参数调优。 |
CPU_RATE_LIMIT | 用于定义在多个资源组竞争CPU资源时的CPU分配比例。 | 无默认值,必填, 取值范围:0~100, 各个资源组的取值之和不超过100。 |
MEMORY_LIMIT | 资源组内存占总内存的百分比。具体内容,请参见6.0资源组内存管理。 | 默认值:0,非必填, 取值范围:0~100, 各个资源组的取值之和不超过100。 |
MEMORY_SHARED_QUOTA | 定义了资源组内部共享内存占所有内存的比例。具体内容,请参见6.0资源组内存管理。 | 默认值:80,非必填, 取值范围:0~100。 |
MEMORY_SPILL_RATIO | 内存敏感事务的内存使用阈值(算子落盘阈值)。 | 默认值:0,非必填 取值范围:0~100。 |
6.0资源组内存管理
数据库按照各个资源组设置的memory_limit在各个资源组之间预留内存资源,如果各个资源组的memory_limit总和小于100,数据库会将剩余未预留的内存分配给资源组全局共享内存池。数据库以先到先得的方式为事务分配资源组全局共享内存。
每个资源组预留的内存池内部,资源组按照MEMORY_SHARED_QUOTA设定每个资源组内用于固定预留部分和共享部分的内存比例。如果MEMORY_SHARED_QUOTA参数设置为100%,那么资源组内部的所有内存都将被视为共享内存,所有任务都可以使用这块内存;如果MEMORY_SHARED_QUOTA参数值小于100%,系统将根据设定的比例将内存划分为固定部分和共享部分,固定部分是每个任务独占的内存,而共享部分是所有任务共享的内存空间。AnalyticDB PostgreSQL 6.0版资源组内存管理机制详解如下图所示:
云原生数据仓库 AnalyticDB PostgreSQL 版资源组进行内存管理时,将数据库机器的内存池划分成组内固定、组内共享和全局共享。在执行查询时会首先使用组内固定部分的内存,在组内固定部分的内存不够时,会申请组内共享部分的内存值。在组内共享部分也耗尽时,会申请全局共享部分的内存值,当全局共享部分的内存也不足时,则会报OOM的错误终止查询。具体内容如下图所示:
当数据库查询同时满足以下条件时,对应查询将由于内存不足导致失败:
没有可用的组内共享内存。
没有可用的全局共享内存。
该事务请求额外的内存。
在实际使用中,一般尽量让组内固定部分的内存覆盖大部分查询所需要的内存,这样在流量高峰到来时可以支持尽可能多的查询并行执行。在业务查询突发需要申请大内存时,也会有足够的查询共享部分内存以供业务正常执行。
6.0资源组并发管理
当进入系统的查询达到所属资源组的并发数上限后,该资源组新进入的查询需要进行等待。并发限制排队时遵循先进先出的原则。
当提交的查询由于达到并发限制而进行等待时,查看pg_stat_activity视图时对应查询处于waiting状态,并且waiting_reason为group。
6.0资源组CPU管理
云原生数据仓库 AnalyticDB PostgreSQL 版资源组支持管理各个组的CPU分配比例,是一种允许抢占的CPU管理方式,数据库按照各个group设定的CPU_RATE_LIMIT值的比例进行CPU时间片分配。如果某资源组设置了较高的CPU_RATE_LIMIT值,那么在竞争CPU时,该资源组将获得较多的CPU时间片,从而更多的执行任务,反之则限制其对CPU资源的使用。同时,资源管理功能支持CPU抢占,如果一个资源组在执行任务而其余资源组没有任务时,那么这个资源组就会占有全部CPU资源。
在两个资源组都很繁忙时,使用CPU_RATE_LIMIT为40创建的资源组将分配两倍于使用CPU_RATE_LIMIT 为20创建的资源组的CPU资源。
在CPU_RATE_LIMIT为40的资源组无查询进入时,CPU_RATE_LIMIT为20的资源组可以使用接近全部的CPU资源。
6.0落盘管理
云原生数据仓库 AnalyticDB PostgreSQL 版源组支持对查询的落盘阈值进行管理。在云原生数据仓库 AnalyticDB PostgreSQL 版中内存密集型算子执行过程可能会产生大量中间临时结果,会需要临时溢出到磁盘,通过调整MEMORY_SPILL_RATIO来增加或减少溢出。因此只有需要产生大量中间临时结果的操作类型受此控制。仍有很多操作是无法溢出到磁盘上的,这些操作会继续占用内存,即使内存使用超过上限值,内存仍有可能增加。
当MEMORY_SPILL_RATIO大于0时,算子落盘阈值由MEMORY_SPILL_RATIO决定。当敏感事务内存达到此阈值,将被溢出到磁盘。
当MEMORY_SPILL_RATIO等于0时,算子落盘阈值由statement_mem决定。statement_mem的详细信息,请参见性能参数调优。
当集群负载大、内存资源紧张时,调小所在资源组的memory_spill_ratio,让内存密集型算子如hashagg、join、sort等在运算过程中更多地进行落盘运算,以减少内存使用。当集群负载小、内存资源充足时,调大所在资源组的memory_spill_ratio,让落盘阈值提高,更多地在内存中进行计算,以提高查询的执行效率。
7.0资源组
AnalyticDB PostgreSQL 7.0版资源组支持配置的资源类别如下:
参数 | 描述 | 取值 |
CONCURRENCY | 资源组内允许的最大并发事务数(并行运行的查询数)。当进入系统的查询达到所属资源组的并发数上限后,该资源组新进入的查询需要进行等待,等待队列无长度限制。并发限制排队时遵循先进先出的原则。 | 默认值:50,非必填, 取值范围:1~max_connections。该参数具体内容,请参见性能参数调优。 |
CPU_MAX_PERCENT | 资源组的CPU使用率上限值。 | 无默认值,必填, 取值范围:0~100, 没有各个资源组的取值之和不超过100的限制。 |
CPU_WEIGHT | 资源组的CPU分配权重。 | 默认值50,非必填, 取值范围:0~500。 |
MEMORY_LIMIT | 资源组使用的内存总和目标值。 取值为int,单位MB。 | 默认值-1,非必填,代表单个查询使用的内存上限为statement_mem,配置非-1的值之后,单个query能够使用的内存是max(memory_limit/concurrency, statement_mem)。 取值范围:大于0,小于gp_vmem_protect_limit参数。 statement_mem和gp_vmem_protect_limit参数具体内容,请参见性能参数调优。 |
MIN_COST | 数据库优化器受控于该资源组的最低成本阈值,优化器成本低于该参数将不受该资源组控制,使用全局资源。 | 默认值为0,代表该资源组内的操作在资源分配优先级上不受最低成本限制的影响,非必填, 取值范围:0~2147483647。 |
7.0 资源组并发管理
当进入系统的查询达到所属资源组的并发数上限后,新进入该资源组的查询需要进行等待。并发限制排队时遵循先进先出的原则。
当提交的查询由于达到并发限制而进行等待时,查看pg_stat_activity视图时wait_event_type为ResourceGroup。
当所在group有大量查询处于并发等待时,需要合理提高资源组并发能力,否则所在group的查询性能可能受到影响。
7.0资源组内存管理
AnalyticDB PostgreSQL 7.0版资源组结合MEMORY_LIMIT配置,以及statement_mem、gp_resgroup_memory_query_fixed_mem参数来管理资源组的内存使用。
当gp_resgroup_memory_query_fixed_mem被配置为大于0的值后,单个查询能够使用的最大内存被限定为该值。
当gp_resgroup_memory_query_fixed_mem被配置为0(默认值)时,资源组结合statement_mem和MEMORY_LIMIT确定单个查询能够使用的内存值。具体如下:
当所在资源组的MEMORY_LIMIT设置为-1时,资源组管理的单个查询能够使用的内存上限被限定为statement_mem。
当所在资源组的MEMORY_LIMIT设置大于-1的值时,资源组管理的单个查询能够使用的内存上限被限定为max(memory_limit/concurrency, statement_mem),即MEMORY_LIMIT除以并发值的结果,与statement_mem中的最大值。例如,在数据库中有一个叫做etl的资源组,它的MEMORY_LIMIT设置成了2.0 GB,并发值设为5。所以默认情况下,单个查询预计能够使用的内存值为400 MB。考虑如下场景:
用户etl1提交了查询Q1,并且session级别配置了gp_resgroup_memory_query_fixed_mem为800 MB(set gp_resgroup_memory_query_fixed_mem='800MB'),statement_mem设置为900MB,Q1最高能够占用800MB的内存。
用户etl2提交了查询Q2,没有配置session级别配置gp_resgroup_memory_query_fixed_mem参数,statement_mem设置为300 MB,小于400 MB,所以Q2提交到系统,并占用了400 MB的内存。
用户etl3提交了查询Q3,没有配置session级别配置gp_resgroup_memory_query_fixed_mem参数,statement_mem设置为700 MB,大于400 MB,所以Q3提交到系统,并占用了700 MB的内存。
7.0资源组CPU管理
AnalyticDB PostgreSQL 7.0版资源组基于CPU_MAX_PERCENT管理每个资源组能够使用的CPU使用率最大值,基于CPU_WEIGHT管理资源组在各个资源组之间的分配比例。会按照各个资源组的CPU_WEIGHT比例去分配CPU时间片,同时保证各个资源组的CPU使用率不超过设定的CPU_MAX_PERCENT值。
例如,数据库中存在rg1和rg2两个group,rg1的CPU_MAX_PERCENT设定为30,CPU_WEIGHT设定为100;rg2的CPU_MAX_PERCENT设定为60,CPU_WEIGHT设定为50。
只有rg1中存在活跃查询,rg2中不存在活跃查询。此时rg1的CPU使用率会达到30%,rg2的CPU使用率会达到60%。
rg1和rg2中同时存在活跃查询。此时数据库会将CPU时间片按照100:50的优先级分配,直至某个资源组的CPU使用率达到了对应的CPU_MAX_PERCENT的限制值。例如,rg1的CPU使用率达到了30%,在此之后即使两者的WEIGHT依然是100:50的关系,也会优先向rg2分配,以确保rg1的CPU使用率不超过30%。
开启资源组管理
通过控制台开启或关闭资源组管理
内核版本为v6.6.1.0及以上的AnalyticDB PostgreSQL 6.0版实例,可以通过控制台开启或关闭资源组管理。切换资源管理模式由资源队列变为资源组,切换过程中会重启实例,并存在大约5分钟实例不可用,请合理规划时间,避免您的业务受到影响。具体操作,请参见如下步骤:
- 登录云原生数据仓库AnalyticDB PostgreSQL版控制台。
- 在控制台左上角,选择实例所在地域。
- 找到目标实例,单击实例ID。
在左侧导航栏,单击工作负载管理。
单击开启资源组管理,并在弹窗中单击确定。
通过提交工单开启或关闭资源组管理
内核版本为v6.6.1.0以下的AnalyticDB PostgreSQL 6.0版实例和AnalyticDB PostgreSQL 7.0版实例,需要提交工单开启或关闭资源组管理。
AnalyticDB PostgreSQL 7.0版实例暂时无法通过控制台使用资源组,仅支持通过SQL语句使用资源组。
开启资源组管理功能后,系统会自动创建一个default_group资源组。在
页面的资源组监控页签可以查看所有资源组监控信息,以及各个Segment的CPU和内存使用等。新增资源组
开启资源组管理后,您可以通过控制台或后台执行SQL的方式新增资源组。
AnalyticDB PostgreSQL 6.0版内部预留了
admin_group
资源组用于管理数据库本身的系统负载。AnalyticDB PostgreSQL 6.0版实例中所有资源组的CPU总和与Memory总和均为100,
admin_group
资源组预留的CPU和Memory为10,因此其他资源组(新增资源组和default_group
资源组)的CPU值总和与Memory值总和不能超过90。AnalyticDB PostgreSQL 7.0版数据库存在默认的三个资源组,
admin_group
和system_group
用于管控数据库本身的系统负载,default_group
用于其他用户默认使用。
控制台操作
在工作负载管理页面,单击新增资源组。
按照版本限制章节中的参数限制填写参数,并单击保存新增。
SQL操作
CREATE RESOURCE GROUP <group_name> WITH (group_attribute=value [, ... ])
对于AnalyticDB PostgreSQL 6.0版group_attribute
包含:
CPU_RATE_LIMIT=integer
MEMORY_LIMIT=integer
[ CONCURRENCY=integer ]
[ MEMORY_SHARED_QUOTA=integer ]
[ MEMORY_SPILL_RATIO=integer ]
对于AnalyticDB PostgreSQL 7.0版group_attribute
包含:
CPU_MAX_PERCENT=integer
[CPU_WEIGHT=integer ]
[ CONCURRENCY=integer ]
[ MEMORY_LIMIT=integer ]
[ MIN_COST=integer ]
查看资源组配置
新增资源组后,您可以通过控制台或后台执行SQL的方式查看资源组配置。
控制台操作
在工作负载管理页面的资源组配置区域,查看实例中所有资源组配置。
SQL操作
使用如下SQL查看资源组配置:
SELECT * FROM gp_toolkit.gp_resgroup_config;
修改资源组配置
您可以通过控制台或后台执行SQL的方式修改资源组配置。
控制台操作
在工作负载管理页面,单击资源组列表上方的编辑。
根据业务需求,修改资源组的并发数、CPU使用或内存百分比等,并单击保存。
SQL操作
对于AnalyticDB PostgreSQL 6.0版,仅数据库初始账号支持修改除admin_group
资源组外其他所有资源组配置,普通账号无法操作。
ALTER RESOURCE GROUP <group_name>
SET CONCURRENCY|CPU_RATE_LIMIT|MEMORY_LIMIT|MEMORY_SHARED_QUOTA|MEMORY_SPILL_RATIO <value>;
示例如下:
修改
test
资源组的并发数为30。ALTER RESOURCE GROUP test SET CONCURRENCY 20;
修改
test_pg1
资源组的CPU使用率为20。ALTER RESOURCE GROUP test_pg1 SET CPU_RATE_LIMIT 20;
对于AnalyticDB PostgreSQL 7.0版,仅数据库初始账号支持修改除admin_group
和system_group
资源组外其他所有资源组配置,普通账号无法操作。
ALTER RESOURCE GROUP <group_name>
SET CPU_MAX_PERCENT|CPU_WEIGHT|CONCURRENCY|MEMORY_LIMIT|MIN_COST <value>;
示例如下:
修改
test
资源组的并发数为30。ALTER RESOURCE GROUP test SET CONCURRENCY 20;
修改
test_pg1
资源组的CPU使用率上限为20。ALTER RESOURCE GROUP test_pg1 SET CPU_MAX_PERCENT 20;
绑定数据库账号
您可以通过控制台或后台执行SQL的方式为资源组绑定数据库账号。如何创建数据库账号,请参见创建数据库账号。
每个资源组可以绑定一个或多个数据库账号,但每个账号只能绑定一个资源组。
数据初始账号默认绑定
default_group
资源组。没有绑定资源组的数据库账号,会默认绑定
default_group
资源组。
控制台操作
在工作负载管理页面的分配资源组区域,单击目标资源组卡片上的按钮。
选择需要角色(数据库账号),并单击确定。
SQL操作
仅数据库初始账号支持绑定资源组,普通账号无法操作。将数据库账号绑定到指定资源组,语法如下:
为已有数据库账号绑定资源组。
ALTER ROLE <user_name> RESOURCE GROUP <group_name>;
新建数据库账号时绑定资源组。
CREATE ROLE <user_name> WITH LOGIN RESOURCE GROUP <group_name>;
删除资源组
您可以通过控制台或后台执行SQL的方式删除资源组。
控制台操作
在工作负载管理页面,单击目标资源组操作列的删除,并单击确定。
SQL操作
仅数据库初始账号支持删除资源组,数据库普通账号无法操作。
版本 | 参数 | 是否能被删除 |
AnalyticDB PostgreSQL 6.0版 |
| 否 |
| 否 | |
AnalyticDB PostgreSQL 7.0版 |
| 否 |
| 否 | |
| 否 |
DROP RESOURCE GROUP <group_name>;
手动查询资源组监控信息
6.0版本
SELECT * FROM gp_toolkit.gp_resgroup_status;
以下是各个监控项的描述:
字段 | 描述 |
rsgname | 资源组名称。 |
groupid | 资源组ID。 |
num_running | 当前处于运行中的查询数。 |
num_queueing | 当前处于排队中的查询数。 |
num_queued | 该资源组中的历史排队总查询数。 |
num_executed | 该资源组中的历史总执行查询数。 |
total_queue_duration | 该资源组的总体累积排队时间。(单位:s) |
cpu_usage | 资源组在各个segment的CPU使用率。 |
memory_used | 资源组实际使用的内存总量(单位:MB)。 |
memory_available | 资源组可用的内存总量(单位:MB)。 |
memory_quota_used | 资源组固定份额部分实际使用的内存总量(单位:MB)。 |
memory_quota_available | 资源组固定份额部分可用的内存总量(单位:MB)。 |
memory_quota_granted | 资源组固定份额部分的总体分配量。 |
memory_shared_used | 资源组共享部分实际使用的内存总量(单位:MB)。 |
memory_shared_available | 资源组共享部分可用的内存总量(单位:MB)。 |
memory_shared_granted | 资源组共享部分的总体分配量。 |
7.0版本
查询排队时间和排队数
SELECT * FROM gp_toolkit.gp_resgroup_status;
以下是各个监控项的描述:
字段 | 描述 |
groupid | 资源组ID。 |
groupname | 资源组名称。 |
num_running | 资源组当前运行事务数。 |
num_queueing | 资源组当前排队事务数。 |
num_queued | 资源组历史排队事务总数。 |
num_executed | 资源组历史运行事务总数。 |
total_queue_duration | 资源组累积排队时间(单位:s)。 |
查询CPU使用率和内存使用率
SELECT * FROM gp_toolkit.gp_resgroup_status_per_host;
以下是各个监控项的描述:
字段 | 描述 |
groupid | 资源组ID。 |
groupname | 资源组名称。 |
hostname | 机器名称。 |
cpu_usage | CPU使用率,百分比。 |
memory_usage | 该segment上该资源组目前使用的内存总量(单位:MB)。 |
关闭资源组管理
如果您需要将资源管理模式切换为资源队列,您可以通过控制台关闭资源组管理。关闭过程中会重启实例,并存在大约5分钟实例不可用,请合理规划时间,避免您的业务受到影响。具体操作如下:
在控制台左上角,选择实例所在的地域。
找到目标实例,单击实例ID。
在左侧导航栏,单击工作负载管理,单击关闭资源组管理。